package list

import "container/list"

// CQueue 维护两个栈，第一个栈支持插入操作，第二个栈支持删除操作。
type CQueue struct {
	stack1, stack2 *list.List
}

func Constructor() CQueue {
	return CQueue{stack1: list.New(), stack2: list.New()}
}

func (cq *CQueue) AppendTail(value int) {
	//stack1.push
	cq.stack1.PushBack(value)
}

/*
 出队列的细节：
	如果stack2不为空， 就stack2直接pop
	如果stack2为空， 就先将stack1中的元素逆序压入stack2中， 然后stack2.pop
*/

func (cq *CQueue) DeleteHead() int {
	//如果stack2为空， 就把stack1中的所有元素逆序压进stack2
	if cq.stack2.Len() == 0 {
		for cq.stack1.Len() > 0 {
			//stack1.pop
			remove := cq.stack1.Remove(cq.stack1.Back())
			//stack2.push
			cq.stack2.PushBack(remove)
		}
	}
	if cq.stack2.Len() > 0 {
		//stack2.pop
		remove := cq.stack2.Remove(cq.stack2.Back())
		return remove.(int)
	}
	return -1
}
